﻿namespace Baggr.ClientSite
{
    using System;
    using System.Linq;

    /// <summary>
    /// Модель дерева фидов.
    /// </summary>
    public class FeedsTree
    {
        /// <summary>
        /// Корневая папка, для которого строится дерево фидов.
        /// </summary>
        private readonly Folder _RootFolder;

        /// <summary>
        /// Конструктор класса.
        /// </summary>
        /// <param name="rootFolder">
        /// Корневая папка, для которого строится дерево фидов.
        /// </param>
        public FeedsTree(Folder rootFolder)
        {
            if (rootFolder == null)
                throw new ArgumentNullException("rootFolder");
            _RootFolder = rootFolder;
        }

        /// <summary>
        /// Получить представление JSON дерева.
        /// </summary>
        /// <returns>
        /// Представление JSON дерева.
        /// </returns>
        public object ToJson()
        {
            return GetFolderChildsJson(_RootFolder);
        }

        /// <summary>
        /// Получить JSON представление фида.
        /// </summary>
        /// <param name="feed">
        /// Рассматриваемый фид.
        /// </param>
        /// <returns>
        /// JSON представление фида.
        /// </returns>
        private static object GetFeedJson(Feed feed)
        {
            return new
            {
                attributes = new { Id = feed.Id },
                data = new { title = feed.Title, attributes = new { type="feed"} }
            };
        }

        /// <summary>
        /// Получить JSON представление папки.
        /// В дерево не будет включена корневая папка.
        /// </summary>
        /// <param name="folder">Представление папки.</param>
        /// <returns>JSON представление папки.</returns>
        private static object GetFolderJson(Folder folder)
        {
            return new
            {
                attributes = new {Id = folder.Id },
                data = new { title = folder.Name, attributes = new { type = "fodler" } },
                children = GetFolderChildsJson(folder)
            };
        }

        private static object GetFolderChildsJson(Folder folder)
        {
            var feeds = folder.Feeds.Select(curr => GetFeedJson(curr.Feed));
            return folder.Folders.Select(curr => GetFolderJson(curr)).Union(feeds).ToArray();
        }
    }
}
